from loguru import logger

from mdtool.commands.base_command import Command
from mdtool.config_reader import Config
from mdtool.feishu_client import FsClient
from mdtool.util import is_valid_dir
from mdtool.wx_history_parser import parse_hisotry_from_string, parse_history_from_dir


class SaveToFeiShuCommand(Command):
    TEMP_JSON_FILE = "latest.json"

    def __save_to_feishu(self, articleList) -> bool:
        """去重后保存"""
        append_data = []
        seen_ids = set()
        for item in articleList:
            if item["media_id"] not in seen_ids:
                append_data.append([item["media_id"], item["title"]])
                seen_ids.add(item["media_id"])
        if not append_data:
            print("没有需要追加的数据。")
            return True
        fs_client = FsClient()
        spreadsheet_token, sheet_id = (
            fs_client.get_spreadsheet_token_and_sheet_id_by_name("test", "Sheet1")
        )
        if not spreadsheet_token or not sheet_id:
            print("未找到名为 test 的 spreadsheet 或 Sheet1")
            return False
        # 读取当前已有数据
        existing_data = fs_client.read_data_from_sheet(
            spreadsheet_token, sheet_id, "A:A"
        )
        # 计算已有行数
        start_row = len(existing_data) + 1  # +1 因为飞书表格是从1开始
        # 计算追加的范围
        end_row = start_row + len(append_data) - 1
        data_range = f"A{start_row}:B{end_row}"
        # 写入数据
        res = fs_client.write_data_to_sheet(
            spreadsheet_token, sheet_id, data_range, append_data
        )
        if res.get("code", -1) == 0:
            print(f"成功追加 {len(append_data)} 条记录到飞书表格。")
            return True
        else:
            print(f"追加数据到飞书表格失败: {res}")
            return False

    def execute(self, config: Config, **kwargs) -> bool:
        jsons_dir = config.get(Config.ARTICLES_JSON_DIR)
        if not is_valid_dir(jsons_dir):
            print(f"{jsons_dir} is not accessable.")
            return False
        articleBriefs = []
        use_clipboard = input("是否从剪切板读取发布列表数据？(y/N): ").strip().lower()
        if use_clipboard == "y":
            prompt = """
1. 在浏览器中登录微信公众号平台(一定要在登录状态)，在地址栏中复制下token, 替换到下面的URL的 {} 中。
2. 打开 URL <https://mp.weixin.qq.com/cgi-bin/appmsgpublish?sub=list&begin=0&count=30&token={}&lang=zh_CN&f=json&ajax=1>
3. 复制Response 到剪切板
"""
            print(prompt)
            try:
                import pyperclip

                clipboard_content = pyperclip.paste()
                articleBriefs = parse_hisotry_from_string(clipboard_content)
            except Exception as e:
                print(f"读取剪切板内容失败: {e}")
                return False
        else:
            prompt = """
1. 在浏览器中登录微信公众号平台(一定要在登录状态)，在地址栏中复制下token, 替换到下面的URL的 {} 中。
2. 打开 URL <https://mp.weixin.qq.com/cgi-bin/appmsgpublish?sub=list&begin=0&count=30&token={}&lang=zh_CN&f=json&ajax=1>
3. 复制Response 保存到配置文件的json_dir 目录下的一个 .json 文件中。
4. 如果需要更多，可以修改 URL 中 begin 的值，再刷新页面即可。
"""
            print(prompt)
            is_ready = input("你保存了对应 的 .json 文件吗？(y/N): ").strip().lower()
            if is_ready == "n":
                return True
            articleBriefs = parse_history_from_dir(jsons_dir)
            if len(articleBriefs) == 0:
                logger.error("没有获取到任何微信公众号最新文章，可能出错了。")
                return False
            if len(articleBriefs) == 0:
                return True
        fs_client = FsClient()
        recorded_articles = fs_client.read_article_ids()
        waiting_uploaded = []
        for item in articleBriefs:
            media_id = item.media_id
            if media_id not in recorded_articles:
                waiting_uploaded.append({"media_id": media_id, "title": item.title})
        print(f"共有 {len(waiting_uploaded)} 个新增文章 需要增加到飞书中。")
        return self.__save_to_feishu(waiting_uploaded)
